package netgames;

import java.util.List;
import javax.swing.JOptionPane;
import principal.AtorJogador;
import uteis.Constantes;
import br.ufsc.inf.leobr.cliente.Jogada;
import br.ufsc.inf.leobr.cliente.OuvidorProxy;
import br.ufsc.inf.leobr.cliente.Proxy;
import br.ufsc.inf.leobr.cliente.exception.ArquivoMultiplayerException;
import br.ufsc.inf.leobr.cliente.exception.JahConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoJogandoException;
import br.ufsc.inf.leobr.cliente.exception.NaoPossivelConectarException;

public class AtorNetGames implements OuvidorProxy {

	private static final long serialVersionUID = 6L;
	protected AtorJogador interfaceGrafica;
	protected Proxy proxy;
	
	public AtorNetGames(AtorJogador interfaceGrafica) {
		this.proxy = Proxy.getInstance();
		this.interfaceGrafica = interfaceGrafica;
		this.proxy.addOuvinte(this);
	}

	public boolean conectar(String servidor, String nome) {
		try {
			if(nome == null){
				return false;
			}
			proxy.conectar(servidor, nome);
			JOptionPane.showMessageDialog(null, Constantes.CONECTADO_SUCESSO.getConstante());
			return true;
		} catch (JahConectadoException e) {
			JOptionPane.showMessageDialog(null, Constantes.JA_CONECTADO.getConstante());
			return true;
		} catch (NaoPossivelConectarException e) {
			JOptionPane.showMessageDialog(null, Constantes.ERRO_CONECTAR.getConstante());
			e.printStackTrace();
		} catch (ArquivoMultiplayerException e) {
			JOptionPane.showMessageDialog(null, Constantes.ERRO_CONECTAR.getConstante());
			e.printStackTrace();
		}
		return false;
	}

	public String obterNomeAdversario(){
		List<String> nomes = proxy.obterNomeAdversarios();
		String nome = "";
		if(nomes.size() == 1){
			nome = nomes.get(0);
		}else{
			for (int j = 0; j < nomes.size(); j++) {
				nome = nome + nomes.get(j) +", ";
			}
		}
		return nome;
	}
	
	public String obterNomeAdversario(int posicao){
		return proxy.obterNomeAdversario(posicao);
	}
	
	public boolean desconectar() {
		try {
			proxy.finalizarPartidaComErro("Um dos jogadores se desconectou do servidor.");
			proxy.desconectar();
			return true;
		} catch (NaoConectadoException e) {
			return false;
		}
	}
	
	public void enviarJogada(JogadaTetris jogadaTetris) {
		Jogada jogada = (Jogada) jogadaTetris;
		try {
			proxy.enviaJogada(jogada);
		} catch (NaoJogandoException e) {
			e.printStackTrace();
		}
	}
	
	public void solicitaNovaPartida() {
		try {
			proxy.iniciarPartida(2);
		} catch (NaoConectadoException e) {
			JOptionPane.showMessageDialog(null, Constantes.NAO_CONECTADO.getConstante());
		}
	}
	
	@Override
	public void iniciarNovaPartida(Integer posicao) {
		interfaceGrafica.receberInicioPartida(posicao);
	}
	
	@Override
	public void receberJogada(br.ufsc.inf.leobr.cliente.Jogada jogada) {
		interfaceGrafica.recebeJogada((JogadaTetris) jogada);
	}

	@Override
	public void receberMensagem(String message) {
		JOptionPane.showMessageDialog(null, message);
	}

	@Override
	public void tratarConexaoPerdida() {
	}

	@Override
	public void tratarPartidaNaoIniciada(String message) {
		interfaceGrafica.tratarPartidaNaoIniciada(message);
		JOptionPane.showMessageDialog(null, message);
	}

	@Override
	public void finalizarPartidaComErro(String message) {
		interfaceGrafica.finalizarPartidaComErro(message);
		JOptionPane.showMessageDialog(null, message);
	}

}